Gliederung¶

  1. Setup
    1. Librarys
  2. Informationen
  3. Einleitung
    1. Fragestellung
    2. Erwartung A Luca Di Palma
    3. Erwartung B Patrick Langkau
  4. Imports
  5. Bereiningung des output Ordners
  6. Visualize Neural Network Function
  7. Reading CSV
  8. Renaming
  9. Removing unused Values
  10. Removing duplicates
  11. Convert Units & Round
  12. Merging
    1. Merged Table
  13. Boxplots
    1. Boxplot GDP
    2. Boxplot Mobile Speed
    3. Boxplot Broadband Speed
    4. Boxplot Happiness Score
    5. Boxplot Unemployment
    6. Boxplot Internet Access
    7. Boxplot Military Spending
  14. Scatterplots
    1. GDP - Broadband Speed
    2. GDP - Mobile Speed
    3. Internet Access - Mobile Speed
    4. Internet Access - Broadband Speed
    5. Unemployment - Mobile Speed
    6. Unemployment - Broadband Speed
    7. Military Spending - Broadband Speed
    8. Military Spending - Mobile Speed
    9. Happiness Score - Mobile Speed
    10. Happiness Score - Broadband Speed
    11. Unemployment - Internet Access
  15. NaN Percentege
  16. Pairplots 1.Pairplot - Mobile Speed 2.Pairplot - Broadband Speed
  17. Heatmaps
  18. Adjusting tmpMobile
  19. Adjusting tmpBroadband
  20. Mobile Speed Neural Net
    1. Mobile Speed - Deep Learning
    2. Mobile Speed - Over Average
    3. Mobile Speed - Under Average
    4. Vergleich Mobile Speed Over Average/Under Average
    5. Mobile Speed - Neural Network Visualisation
  21. Broadband Speed Neural Net
    1. Broadband Speed - Deep Learning
    2. Broadband Speed - Over Average
    3. Broadband Speed - Under Average
    4. Vergleich Broadband Speed Over Average/Under Average
    5. Broadband Speed - Neural Network Visualisation
  22. Welt Ansichten
    1. Welt - Broadband Speed
    2. Welt - Mobile Speed
  23. Quellen

1. Setup¶

1.A. Librarys:¶

Sie müssen die folgenden Kommandos ausführen, um die für dieses Programm benötigten Librarys zu installieren

pip install matplotlib¶

pip install numpy¶

pip install pandas¶

pip install seaborn¶

pip install keras¶

pip install sklearn¶

pip install tensorflow¶

pip install plotly¶

2. Informationen¶

Dieses Projekt wurde unter Python 3.10 getestet. Die Funktion unter einer anderen Version kann nicht gewährleistet werden.

Die Aufteilung in diesem Dokument wurde so vorgenommen, dass Luca Di Palma den Vergleich der Daten mit der Mobilen Internet Geschwindigkeit übernommen hat und Patrick Langkau den Vergleich mit der Breitband Geschwindigkeit. In jedem Abschnitt wird der Author explizit genannt

Der Code muss, um korrekt zu funktionieren, komplett ausgeführt werden. Eine Einzelausführung mancher Zellen kann unerwünschte Ergebnisse hervorbringen.

Bitte lassen Sie keine Diagramme aus dem output Ordner geöffnet wenn Sie den Code ausführen, dies kann zu Fehlern führen.

Alle erstellten Diagramme sind auch im Ordner ../output/ zu finden

3. Einleitung¶

3.A. Fragestellung¶

Ein Phänomen dessen Einfluss die ganze Welt verändert hat: Das Internet. Ohne es würde die ganze Infrastruktur der Welt zusammenstürzen und den Fortschritt der Menschheit einige Jahrzehnte zurückwerfen. Doch obwohl die ganze Welt miteinander vernetzt ist, hat nicht jedes Land die gleichen Möglichkeiten, das Internet zu benutzen. So Unterscheiden sich die Länder in vielen verschiedenen Faktoren. Z.B. wie gut der Zugriff auf das Internet ist oder auch wie hoch die Arbeitslosigkeit in einem Land möglicherweise dessen Ausbau verhindert. Doch welche Faktoren haben einen Einfluss die mobile und die Breitbandgeschwindigkeit? Im Folgenden werden Faktoren mit der Internetgeschwindigkeit in Korrelation gebracht, die möglicherweise einen Einfluss darauf haben, wie schnell das Internet im jeweiligen Land ist.

3.B. Erwartung A (Luca Di Palma)¶

- Es wird vermutet, dass die Internetgeschwindigkeit abhängig von verschiedenen Faktoren wie z.B. der wirtschaftlichen Lage, dem Wohlbefinden der Bürger, oder dem Zugang zum Internet ist.¶
- Ein höherer Happiness Score lässt eine schnellere Internetverbindung Vermuten¶

Eine gute Internetverbindung kann ein Faktor dafür sein, dass die Bürger eines Landes glücklicher sind. Die gute Vernetzung kann einen positiven Einfluss auf die sozialen Kontakte haben, wenn z.B. Familien oder auch Freunde die nicht in unmittelbare Nähe beieinander wohnen dennoch gut miteinander kommunizieren können.

- Je höher die Militärausgaben, desto höher ist vermutlich auch die Internetgeschwindigkeit¶

Durch eine höhere Militarisierung muss das Militär im Land gut und schnell vernetzt sein. Diese Infrastruktur könnte den Bürgern des Landes teilweise zur Verfügung gestellt werden.

3.C. Erwartungen B (Patrick Langkau)¶

- Eine Bessere wirtschaftliche Lage eines Landes, lässt eine höhere Internetgeschwindigkeit erwarten.¶
- Wo ein höherer Prozentsatz der Menschen Zugriff auf das Internet hat, wird auch eine höhere Internetgeschwindigkeit erwartet.¶
- Es wird erwartet, dass eine niedrigere Arbeitslosigkeit dazu führt, das mehr Personen Zugang zum Internet haben.¶

4. Imports (Luca Di Palma, Patrick Langkau)¶

Da die Imports von Luca Di Palma, sowie von Patrick Langkau benötigt werden, wurden diese im folgenden Code Block zu einem Abschnitt zusammengefasst.

In [1]:
import matplotlib.pyplot as plt
import numpy as np
from numpy.random import seed
import pandas as pd
import seaborn as sns
import tensorflow
import keras
from keras.layers import Dense
from keras.models import Sequential
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import plotly.express as px
import shutil
import os

5. Bereinigung des output ordners¶

In diesem Codeblock wird der output Ordner bereinigt. In dem output Ordnern werden später alle Diagramme als Bildformat png gespeichert. Das soll verhindern, dass bei Änderungen der Grafiken konflikte entstehen.

In [2]:
for root, dirs, files in os.walk('..\output'):
    for f in files:
        os.unlink(os.path.join(root, f))
    for d in dirs:
        shutil.rmtree(os.path.join(root, d))
open('..\output\.gitkeep', 'a').close()

6. Visualize Neural Network Function (Folgenden Codeblock beschreiben und zur gliederung hinzufügen)¶

In [3]:
def utils_nn_config(model):
    lst_layers = []
    if "Sequential" in str(model): #-> Sequential doesn't show the input layer
        layer = model.layers[0]
        lst_layers.append({"name":"input", "in":int(layer.input.shape[-1]), "neurons":0,
                           "out":int(layer.input.shape[-1]), "activation":None,
                           "params":0, "bias":0})
    for layer in model.layers:
        try:
            dic_layer = {"name":layer.name, "in":int(layer.input.shape[-1]), "neurons":layer.units,
                         "out":int(layer.output.shape[-1]), "activation":layer.get_config()["activation"],
                         "params":layer.get_weights()[0], "bias":layer.get_weights()[1]}
        except:
            dic_layer = {"name":layer.name, "in":int(layer.input.shape[-1]), "neurons":0,
                         "out":int(layer.output.shape[-1]), "activation":None,
                         "params":0, "bias":0}
        lst_layers.append(dic_layer)
    return lst_layers

def visualize_nn(model, filename, description=False, figsize=(10,8)):
    ## get layers info
    lst_layers = utils_nn_config(model)
    layer_sizes = [layer["out"] for layer in lst_layers]

    ## fig setup
    fig = plt.figure(figsize=figsize)
    ax = fig.gca()
    ax.set(title=model.name)
    ax.axis('off')
    left, right, bottom, top = 0.1, 0.9, 0.1, 0.9
    x_space = (right-left) / float(len(layer_sizes)-1)
    y_space = (top-bottom) / float(max(layer_sizes))
    p = 0.025

    ## nodes
    for i,n in enumerate(layer_sizes):
        top_on_layer = y_space*(n-1)/2.0 + (top+bottom)/2.0
        layer = lst_layers[i]
        color = "green" if i in [0, len(layer_sizes)-1] else "blue"
        color = "red" if (layer['neurons'] == 0) and (i > 0) else color

        ### add description
        if (description is True):
            d = i if i == 0 else i-0.5
            if layer['activation'] is None:
                plt.text(x=left+d*x_space, y=top, fontsize=10, color=color, s=layer["name"].upper())
            else:
                plt.text(x=left+d*x_space, y=top, fontsize=10, color=color, s=layer["name"].upper())
                plt.text(x=left+d*x_space, y=top-p, fontsize=10, color=color, s=layer['activation']+" (")
                plt.text(x=left+d*x_space, y=top-2*p, fontsize=10, color=color, s="Σ"+str(layer['in'])+"[X*w]+b")
                out = " Y"  if i == len(layer_sizes)-1 else " out"
                plt.text(x=left+d*x_space, y=top-3*p, fontsize=10, color=color, s=") = "+str(layer['neurons'])+out)

        ### circles
        for m in range(n):
            color = "limegreen" if color == "green" else color
            circle = plt.Circle(xy=(left+i*x_space, top_on_layer-m*y_space-4*p), radius=y_space/4.0, color=color, ec='k', zorder=4)
            ax.add_artist(circle)

            ### add text
            if i == 0:
                plt.text(x=left-4*p, y=top_on_layer-m*y_space-4*p, fontsize=10, s=r'$X_{'+str(m+1)+'}$')
            elif i == len(layer_sizes)-1:
                plt.text(x=right+4*p, y=top_on_layer-m*y_space-4*p, fontsize=10, s=r'$y_{'+str(m+1)+'}$')
            else:
                plt.text(x=left+i*x_space+p, y=top_on_layer-m*y_space+(y_space/8.+0.01*y_space)-4*p, fontsize=10, s=r'$H_{'+str(m+1)+'}$')

    ## links
    for i, (n_a, n_b) in enumerate(zip(layer_sizes[:-1], layer_sizes[1:])):
        layer = lst_layers[i+1]
        color = "green" if i == len(layer_sizes)-2 else "blue"
        color = "red" if layer['neurons'] == 0 else color
        layer_top_a = y_space*(n_a-1)/2. + (top+bottom)/2. -4*p
        layer_top_b = y_space*(n_b-1)/2. + (top+bottom)/2. -4*p
        for m in range(n_a):
            for o in range(n_b):
                line = plt.Line2D([i*x_space+left, (i+1)*x_space+left],
                                  [layer_top_a-m*y_space, layer_top_b-o*y_space],
                                  c=color, alpha=0.5)
                if layer['activation'] is None:
                    if o == m:
                        ax.add_artist(line)
                else:
                    ax.add_artist(line)
    plt.savefig(fr'..\output\{filename}.png')
    plt.show()

7. Reading CSV¶

Im ersten Schritt ist Reading CSV ist dafür verantwortlich, die CSV-Dateien mit den Daten der einzelnen Datensätze so zu bearbeiten, dass sie ohne Kommas und Semikolons in Variablen gespeichert werden. Im zweiten Schritt werden diese Daten in Dataframes (Zweidimensionale Tabellen) gespeist. Dabei werden nur relevante Daten, wie z.B. bestimmte Jahre der Datenerhebung, für die Erstellung der Dataframes eingelesen.

In [4]:
gdp_data = pd.read_csv(r'..\gdp_csv.csv')
internet_speed_data = pd.read_csv(r'..\internet_speeds.csv', sep=";")
internet_access_data = pd.read_csv(r'..\internet_access.csv')
unemployment_data = pd.read_csv(r'..\unemployment.csv', on_bad_lines='skip')
military_data = pd.read_csv(r'..\military_expenditure.csv')
happy_data = pd.read_csv(r'..\world_happiness_report_2022.csv', decimal=",", sep=";")
country_codes_data = pd.read_csv(r'..\country_codes.csv', sep=";")

gdp = pd.DataFrame(gdp_data, columns=['Country Code', 'Value', 'Year'])
internet_speed = pd.DataFrame(internet_speed_data, columns=['Country','Broadband Mbps', 'Mobile Mbps', 'As of'])
internet_access = pd.DataFrame(internet_access_data, columns=['Country Code', '2020'])
unemployment = pd.DataFrame(unemployment_data, columns=['Country Code','2021'])
military = pd.DataFrame(military_data, columns=['Code', '2018'])
happy = pd.DataFrame(happy_data, columns=['Country', 'Happiness score'])
country_codes = pd.DataFrame(country_codes_data, columns=['Country', 'Alpha-3 code'])

8. Renaming¶

In Renaming werden die Spalten der zuvor eingelesenen relevanten Daten umbenannt. Dies dient dazu, die Dataframes später für den menschlichen Leser überschaubarer und einfacher lesbar zu machen.

In [5]:
gdp.rename(columns = {'Country Code':'CountryCode', 'Year':'YearGDP', 'Value':'GDP'}, inplace = True)
internet_speed.rename(columns = {'Country':'CountryName', 'Broadband Mbps':'BroadbandSpeed', 'Mobile Mbps':'MobileSpeed', 'As of':'YearInternetSpeed'}, inplace = True)
internet_access.rename(columns={'Country Code':'CountryCode', '2020':'InternetAccess2020'}, inplace= True)
unemployment.rename(columns= {'Country Code':'CountryCode', '2021':'Unemployment2021'}, inplace=True)
military.rename(columns= {'Code':'CountryCode', '2018':'MilitarySpending2018'}, inplace=True)
happy.rename(columns= {'Country':'CountryName', 'Happiness score':'HappinessScore2022'}, inplace=True)
country_codes.rename(columns= {'Alpha-3 code':'CountryCode', 'Country':'CountryName'}, inplace=True)

9. Removing unused Values¶

In diesem Codeblock werden ungenutzte Werte des world_happiness_report_2022 Datensatzes entfernt. Damit sind Sterne ("*") im Datensatz gemeint, die bei manchen Ländern in der Spalte "CountryName" vorhanden sind. Diese werden entfernt, um die richtigen Ländercodes aus dem Datensatz country_codes zuordnen zu können.

In [6]:
country_codes['CountryCode'] = country_codes['CountryCode'].replace({'"':''}, regex=True)
happy['CountryName'] = happy['CountryName'].replace({'\*':''}, regex=True)

10. Removing Duplicates¶

In den Daten von gdp_csv und internet_speeds befinden sich Duplikate. Um keine Redundanz zu erzeugen, werden zunächst alle Daten der beiden Datensätze nach Land und Jahr sortiert. Sollten Duplikate bestehen, werden diese direkt aufeinander folgen. Nun werden, bis auf den Wert der an oberster Stelle steht, Daten gelöscht, deren Ländercodes mehrmals vorkommen.

In [7]:
gdp.sort_values(by=['CountryCode','YearGDP'], ascending=False, inplace=True)
internet_speed.sort_values(by=['CountryName','YearInternetSpeed'], ascending=False, inplace=True)

gdp.drop_duplicates(subset=['CountryCode'], keep='first', inplace=True)
internet_speed.drop_duplicates(subset=['CountryName'], keep='first', inplace=True)

11. Convert Units & Round¶

Da bei den Daten von gdp_csv und military_expenditure extrem große Zahlen bestehen, werden diese in eine andere Darstellung konvertiert und gerundet. „GDP“-Werte in gdp_csv werde durch 1.000.000.000 (eine Milliarde) geteilt und auf 2 (zwei) Nachkommastellen gerundet. „MilitarySpending2018“-Werte in military_expenditure werden durch 1.000.000 (eine Million) geteilt und auf 2 (zwei) Nachkommastellen gerundet.

In [8]:
gdp['GDP'] = gdp['GDP'].div(1000000000).round(2)
military['MilitarySpending2018'] = military['MilitarySpending2018'].div(1000000).round(2)

12. Merging¶

Nun werden alle Daten miteinander verschmolzen. Dafür werden alle DataFrames mittels left-Joins miteinander verbunden. Vorangehende und folgende Leerzeichen werden entfernt. Schlussendliche entsteht ein Dataset, in dem alle relevanten Daten vorhanden sind. Im Folgenden werden 20 Daten dieses Datasets als Tabelle ausgegeben.

In [9]:
internet_speed = pd.merge(internet_speed, country_codes, how='left', on='CountryName')
happy = pd.merge(happy, country_codes, how='left', on='CountryName')
happy.drop('CountryName', axis=1, inplace=True)
internet_speed['CountryCode'] = internet_speed['CountryCode'].str.strip()
happy['CountryCode'] = happy['CountryCode'].str.strip()
internet_access['CountryCode'] = internet_access['CountryCode'].str.strip()
unemployment['CountryCode'] = unemployment['CountryCode'].str.strip()
military['CountryCode'] = military['CountryCode'].str.strip()
dataset = pd.merge(internet_speed, gdp, how='left', on = 'CountryCode')
dataset = pd.merge(dataset, internet_access, how='left', on='CountryCode')
dataset = pd.merge(dataset, unemployment, how='left', on='CountryCode')
dataset = pd.merge(dataset, military, how='left', on='CountryCode')
dataset = pd.merge(dataset, happy, how='left', on='CountryCode')
dataset.head(80)
Out[9]:
CountryName BroadbandSpeed MobileSpeed YearInternetSpeed CountryCode GDP YearGDP InternetAccess2020 Unemployment2021 MilitarySpending2018 HappinessScore2022
0 Zimbabwe 5.21 12.02 January 2022 ZWE 16.62 2016.0 29.300000 5.174 420.36 2.995
1 Zambia 4.60 12.46 January 2022 ZMB 21.06 2016.0 19.800000 13.026 378.03 3.760
2 Yemen 2.74 0.53 January 2022 YEM 27.32 2016.0 NaN 13.574 NaN 4.197
3 Western Sahara 10.51 NaN January 2022 ESH NaN NaN NaN NaN NaN NaN
4 Vietnam 67.50 39.01 January 2022 VNM 205.28 2016.0 70.300000 2.166 5500.00 5.485
... ... ... ... ... ... ... ... ... ... ... ...
75 Micronesia 9.75 NaN January 2022 FSM 0.33 2016.0 NaN NaN NaN NaN
76 Mexico 38.77 22.26 January 2022 MEX 1046.92 2016.0 71.968194 4.379 6567.51 6.128
77 Mauritius 19.88 20.59 January 2022 MUS 12.17 2016.0 64.884904 7.414 23.20 6.071
78 Mauritania 6.10 NaN January 2022 MRT 4.74 2016.0 40.800000 11.463 159.01 4.153
79 Marshall Islands 9.29 NaN January 2022 MHL 0.19 2016.0 NaN NaN NaN NaN

80 rows × 11 columns

12.A Merged Table¶

In dieser Tabelle werden nun alle Daten und die zugehörigen Länder ausgegeben. Werte die "NaN" sind, sind nicht vorhanden. Sortiert wurden die Länder von Z-A. So sind die Daten, aus denen die Internetgeschwindigkeiten gemessen wurden, alle vom Januar 2022. Bei den GDPs wurden immer die zuletzt veröffentlichen Zahlen und das Jahr angegeben. Internet Access Daten sind aus dem Jahr 2020, Unemployment Daten aus dem Jahr 2021. Die Daten zum Military Spending sind aus dem Jahr 2018, der Happiness Score ist am aktuellsten, die Daten sind aus dem Jahr 2022.

13. Boxplots¶

Bei einem Boxplot handelt es sich um ein Diagramm, welches die Verteilung eines Merkmals grafisch darstellt. Dieses Merkmal muss mindestens ordinal skaliert sein. Oft wird auch der Begriff Box-Whisker-Plot benutzt. Im Diagramm soll einfach dargestellt werden, in welchem Bereich die Daten liegen und wie sie sich verteilen. So besteht der Boxplot aus 5 Merkmalen: Dem unteren Whisker, dem unteren Quartil, dem Median, dem oberen Quartil und dem oberen Whisker. Innerhalb der Box, also zwischen oberem und unterem Quartil, befinden sich 50 % der Daten. Innerhalb der Box ist ein Strich zu finden, er stell den Median dar.

13.A Boxplot GDP¶

In diesem Diagramm werden die Daten der GDPs der verschiedenen Länder veranschaulicht. Angegeben sind die Daten in Milliarden USD. Dieser Boxplot hat als einer von zwei nicht die Punkte eingezeichnet, die die einzelnen Länder repräsentieren sollen. Das liegt daran, dass die Unterschiede zu groß sind und der Boxplot nicht mehr richtig lesbar ist.

In [10]:
plotBroadBand = sns.boxplot(x=gdp['GDP'], showfliers = False)
#plotBroadBand = sns.swarmplot(x=gdp['GDP'], color="r")
plotBroadBand.set(
    xlabel='GDP in billion USD'
)
plotBroadBand.get_figure().savefig(r'..\output\GDP Boxplot.png')
plt.show()

Die Hälfte der Länder hat einen GDP zwischen ~0 und ~500 Milliarden USD. Der obere Whisker geht dennoch bis fast 1100.

13.B Boxplot Mobile Speed¶

In diesem Diagramm wird der Boxplot zur mobilen Internetgeschwindigkeit dargestellt. Jeder rote Punkt repräsentiert ein Land. Die Daten sind in Mbps angegeben.

In [11]:
plotBroadBand = sns.boxplot(x=dataset['MobileSpeed'], showfliers= False)
plotBroadBand = sns.swarmplot(x=dataset['MobileSpeed'], color="r")
plotBroadBand.set(
    xlabel='Mobile Speed in Mbps'
)
plotBroadBand.get_figure().savefig(r'..\output\Mobile Speed Boxplot.png')
plt.show()

50 % der Länder haben eine mobile Internetgeschwindigkeit zwischen ~15 und ~50 Mbps. Auffällig ist eine Ansammlung vieler Länder am unteren Quartil, sowohl außerhalb als auch innerhalb der Box. Außerhalb der Box findet sich eine weitere auffällige Ansammlung von Ländern bei ~75 Mbps. Die Verteilung der Länder ist hier zu Anfang bei weniger Geschwindigkeit breiter gefächert. Je höher die mobile Internetgeschwindigkeit ist, desto weniger Länder sind im Diagramm zu sehen.

13.C Boxplot Broadband Speed¶

In diesem Diagramm wird der Boxplot zur Breitbandgeschwindigkeit dargestellt. Jeder rote Punkt repräsentiert ein Land. Die Daten sind in Mbps angegeben.

In [12]:
plotBroadBand = sns.boxplot(x=dataset['BroadbandSpeed'], showfliers= False)
plotBroadBand = sns.swarmplot(x=dataset['BroadbandSpeed'], color="r")
plotBroadBand.set(
    xlabel='Broadband Speed in Mbps'
)
plotBroadBand.get_figure().savefig(r'..\output\Broadband Speed Boxplot.png')
plt.show()

50 % der Länder haben eine Breitbandgeschwindigkeit zwischen ~12 und ~70 Mbps. Auffällig ist eine große Ansammlung von Länder vor dem unteren Quartil. Diese Länder befinden sich nicht in der Box. Die Verteilung der Länder ist hier zu Anfang bei weniger Geschwindigkeit breiter gefächert. Je höher die Breitbandgeschwindigkeit ist, desto weniger Länder sind im Diagramm zu sehen.

13.D Happiness Score Boxplot¶

In diesem Diagramm wird der Boxplot zum Happiness Score dargestellt. Jeder rote Punkt repräsentiert ein Land.

In [13]:
plotBroadBand = sns.boxplot(x=dataset['HappinessScore2022'], showfliers= False)
plotBroadBand = sns.swarmplot(x=dataset['HappinessScore2022'], color="r")
plotBroadBand.set(
    xlabel='Happiness Factor'
)
plotBroadBand.get_figure().savefig(r'..\output\Happiness Boxplot.png')
plt.show()

50 % der Länder haben einen Happiness Score zwischen ~4,9 und ~6,3. Im Gegensatz zu den Internetgeschwindigkeiten, sind hier keine Auffällig großen Ansammlung von Ländern bei einem bestimmt Happiness Score. Des Weiteren gibt es nur einen Ausreißer, der unter dem unteren Whisker ist.

13.E Unemployment Boxplot¶

In diesem Diagramm wird der Boxplot zur Arbeitslosigkeit dargestellt. Jeder rote Punkt repräsentiert ein Land. Die Daten sind in % angegeben.

In [14]:
plotBroadBand = sns.boxplot(x=dataset['Unemployment2021'], showfliers= False)
plotBroadBand = sns.swarmplot(x=dataset['Unemployment2021'], color="r")
plotBroadBand.set(
    xlabel='Unemployment in %'
)
plotBroadBand.get_figure().savefig(r'..\output\Unemployment Boxplot.png')
plt.show()

50 % der Länder haben eine Arbeitslosenquote zwischen ~4 und ~12 %. Eine große Ansammlung an Länder findet sich am unteren Quartil. So befinden sich bei 0 % wenige Länder, je weiter es gegen 5 % läuft desto mehr Länder werden es. Ab 5 % ist die Anzahl an Ländern wieder abnehmend.

13.F Internet Access Boxplot¶

In diesem Diagramm wird der Boxplot zum Internet Access dargestellt. Jeder rote Punkt repräsentiert ein Land. Die Daten sind in % angegeben.

In [15]:
plotBroadBand = sns.boxplot(x=dataset['InternetAccess2020'], showfliers= False)
plotBroadBand = sns.swarmplot(x=dataset['InternetAccess2020'], color="r")
plotBroadBand.set(
    xlabel='Internet Access in %'
)
plotBroadBand.get_figure().savefig(r'..\output\Internet Access Boxplot.png')
plt.show()

50 % der Länder haben einen Internet Acces zwischen ~42 und ~88 %. Auffällig hier ist eine große Ansammlung an Ländern zwischen ~70 und 100 %.

13.G Military Spending Boxplot¶

In diesem Diagramm werden die Daten der Militärausgaben der verschiedenen Länder veranschaulicht. Angegeben sind die Daten in Millionen USD. Dieser Boxplot hat als zweiter von zwei nicht die Punkte eingezeichnet, die die einzelnen Länder repräsentieren sollen. Das liegt daran, dass die Unterschiede zu groß sind und der Boxplot nicht mehr richtig lesbar ist.

In [16]:
plotBroadBand = sns.boxplot(x=dataset['MilitarySpending2018'], showfliers= False)
#plotBroadBand = sns.swarmplot(x=dataset['MilitarySpending2018'], color="r")
plotBroadBand.set(
    xlabel='Military Spending 2018 in million USD'
)
plotBroadBand.get_figure().savefig(r'..\output\Military Spending Boxplot.png')
plt.show()

50 % der Länder haben Militärausgaben zwischen ~100 und ~4900 Mio. USD.

14. Scatterplots¶

Im Folgenden wurden Scatterplots erstellt, um eine Korrelation zwischen den einzelnen Datensätzen darzustellen. Scatter Plots stellen grafisch die Beziehung zwischen zwei Daten dar. In diesem Fall wurde noch der Mittelwert aller Daten mit einer Medianlinie dargestellt. Dabei stellt jeder Punkt im Graph eine Land dar. Die Linie zeigt den Mittelwert an. Die genauen Korrelationskoeffizienten können hier eingesehen werden.

14.A GDP - Broadband Speed¶

Hier wird der GDP in Milliarden (Englisch Milliarden = Billion) USD mit der Breitbandgeschwindigkeit in Mbps (Megabits per second) vergleichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [17]:
plotBroadBand = sns.lmplot(x="GDP", y="BroadbandSpeed", data=dataset)
plotBroadBand.set_xlabels('GDP in billion USD')
plotBroadBand.set_ylabels('Broadband Speed in Mbps')
plt.xlim(0, 20000)
plotBroadBand.savefig(r'..\output\GDP - Broadband Speed.png')
plt.show()

Die Grafik zeigt eine positive Korrelation zwischen den Daten. Im Durchschnitt steigt die Breitbandgeschwindigkeit, wenn der GDP höher ist. Auffällig sind hier Länder, die einen Extrem hohen GDP haben, aber nicht die höchste Breitbandgeschwindigkeit. In diesen Bereich fallen z.B. die USA, China und auch Deutschland. Das zeigt, dass ein höherer GDP zwar mit einer höheren Breitbandgeschwindigkeit zusammenhängt, aber nicht 1:1 korreliert. Das könnte auch mit der Fläche und der Landschaft der einzelnen Länder zusammenhängen. So hat die USA beispielsweise eine sehr große Oberfläche und sehr viele verschiedene Landschaften wie Wüsten, Berge und Naturschutzgebiete.

14.B GDP - Mobile Speed¶

Hier wird der GDP in Milliarden (Englisch Milliarden = Billion) USD mit der mobilen Internetgeschwindigkeit in Mbps vergleichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [18]:
plotBroadBand = sns.lmplot(x="GDP", y="MobileSpeed", data=dataset)
plotBroadBand.set_xlabels('GDP in billion USD')
plotBroadBand.set_ylabels('Mobile Speed in Mbps')
plt.xlim(0, 20000)
plotBroadBand.savefig(r'..\output\GDP - Mobile Speed.png')
plt.show()

Die Grafik zeigt eine positive Korrelation zwischen den Daten. Im Durchschnitt steigt die mobile Internetgeschwindigkeit, wenn der GDP höher ist. Wie bei der Breitbandgeschwindigkeit bereits sind die Länder mit extrem hohem GDP auffällig. Auch hier haben diese Länder nicht die höchste mobile Internetgeschwindigkeit, wenn sie den höchsten GDP haben. Dies könnte wie bei der Breitbandgeschwindigkeit bereits mit der Fläche und Landschaft einzelner Länder zusammenhängen.

14.C Internet Access - Mobile Speed¶

In diesem Scatterplot wird der Internet Access in % mit der mobilen Internetgeschwindigkeit in Mbps verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [19]:
plotBroadBand = sns.lmplot(x="InternetAccess2020", y="MobileSpeed", data=dataset)
plotBroadBand.set_xlabels('Internet Access in %')
plotBroadBand.set_ylabels('Mobile Speed in Mbps')
plotBroadBand.savefig(r'..\output\Internet Access - Mobile Speed.png')
plt.show()

Die Grafik zeigt eine positive Korrelation zwischen den Daten. Im Durchschnitt ist die mobile Internetgeschwindigkeit höher, wenn der Internet Access höher ist. Auffällig sind hier vor allem die gegen Ende sehr breit gefächerten Unterschiede zwischen den einzelnen Ländern im Mobile Speed bei gleichem Internet Access. Ab ca. 60% Internet Access beginnen diese Unterschiede.

14.D Internet Access - Broadband Speed¶

In diesem Scatterplot wird der Internet Access in % mit der Breitbandgeschwindigkeit in Mbps verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [20]:
plotBroadBand = sns.lmplot(x="InternetAccess2020", y="BroadbandSpeed", data=dataset)
plotBroadBand.set_xlabels('Internet Access in %')
plotBroadBand.set_ylabels('Broadband Speed in Mbps')
plotBroadBand.savefig(r'..\output\Internet Access - Broadband Speed.png')
plt.show()

Die Grafik zeigt eine positive Korrelation zwischen den Daten. Im Durchschnitt ist die Breitbandgeschwindigkeit höher, wenn der Internet Access höher ist. Besonders auffällig sind die extremen Unterschiede in der Breitbandgeschwindigkeit bei gleichem Internet Access. So sind manche Länder bei einem Internet Access von über 80 % und haben dennoch eine Breitbandgeschwindigkeit von ca. 10 Mbps, während andere Länder mit gleichem Internet Access bei einer Breitbandgeschwindigkeit von ca. 180 Mbps sind.

14.E Unemployment - Mobile Speed¶

In diesem Scatterplot wird der Arbeitslosenquote in % mit der mobilen Internetgeschwindigkeit in Mbps verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [21]:
plotBroadBand = sns.lmplot(x="Unemployment2021", y="MobileSpeed", data=dataset)
plotBroadBand.set_xlabels('Unemployment in %')
plotBroadBand.set_ylabels('Mobile Speed in Mbps')
plotBroadBand.savefig(r'..\output\Unemployment - Mobile Speed.png')
plt.show()

Die Grafik zeigt eine negative Korrelation zwischen den Daten. Im Durchschnitt steigt die mobile Internetgeschwindigkeit, wenn die Arbeitslosenquote sinkt. Die größte Ansammlung an Daten befindet sich bei ca. 5 % Unemployment. Hierbei sind viele Länder bei einem mobilen Internetgeschwindigkeit von ~20 Mbps. Dennoch sind die Unterschiede hier ebenfalls auffällig groß, so haben wir hier eine Spanne in der mobilen Intergeschwindigkeit von 2 bis 135 Mbps, alle bei ca. 5 % Arbeitslosigkeit. Das liegt vermutlich daran, dass zwischen 2011 und 2021 die Arbeitslosigkeit weltweit bei ca. 6,2 % lag

14.F Unemployment - Broadband Speed¶

In diesem Scatterplot wird die Arbeitslosenquote in % mit der Breitbandgeschwindigkeit in Mbps verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [22]:
plotBroadBand = sns.lmplot(x="Unemployment2021", y="BroadbandSpeed", data=dataset)
plotBroadBand.set_xlabels('Unemployment in %')
plotBroadBand.set_ylabels('Broadband Speed in Mbps')
plotBroadBand.savefig(r'..\output\Unemployment - Broadband Speed.png')
plt.show()

Die Grafik zeigt eine negative Korrelation zwischen den Daten. Im Durchschnitt steigt die Breitbandgeschwindigkeit, wenn die Arbeitslosenquote sinkt. Wie bereits bei der mobilen Internetgeschwindigkeit sind auch hier die extremen Unterschiede in der Breitbandgeschwindigkeit bei gleicher Arbeitslosenquote sehr auffällig. Ebenfalls bei ca. 5 % Arbeitslosigkeit liegt die Breitbandgeschwindigkeit in einer Spanne von fast 0 bis ca. 190 Mbps.

14.G Military Spending - Broadband Speed¶

In diesem Scatterplot wird das Military Spending in Millionen USD mit der Breitbandgeschwindigkeit in Mbps verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [23]:
plotBroadBand = sns.lmplot(x="MilitarySpending2018", y="BroadbandSpeed", data=dataset)
plotBroadBand.set_xlabels('Military Spending 2018 in million USD')
plotBroadBand.set_ylabels('Broadband Speed in Mbps')
plt.xlim(0, 100000) #Ohne USA
plotBroadBand.savefig(r'..\output\Military Spending - Broadband Speed.png')
plt.show()

Die Grafik zeigt eine sehr leicht positive Korrelation zwischen den Daten. Im Durchschnitt steigt die Breitbandgeschwindigkeit leicht, wenn das Military Spending höher ist. Da die Korrelation nur sehr leicht zu sehen ist, hat dieser Faktor vermutlich fast keinen einflussreichen Effekt auf die Breitbandgeschwindigkeit.

14.H Military Spending - Mobile Speed¶

In diesem Scatterplot wird die Military Spending in Millionen USD mit der mobilen Internetgeschwindigkeit in Mbps verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [24]:
plotBroadBand = sns.lmplot(x="MilitarySpending2018", y="MobileSpeed", data=dataset)
plotBroadBand.set_xlabels('Military Spending 2018 in million USD')
plotBroadBand.set_ylabels('Mobile Speed in Mbps')
plt.xlim(0, 100000) #Ohne USA
plotBroadBand.savefig(r'..\output\Military Spending - Mobile Speed.png')
plt.show()

Die Grafik zeigt eine sehr leicht positive Korrelation zwischen den Daten. Im Durchschnitt steigt die mobile Internetgeschwindigkeit leicht, wenn das Military Spending höher ist. Da die Korrelation hier wie bei der Breitbandgeschwindigkeit nur sehr leicht vorhanden ist, hat der Faktor auch hier fast keinen einflussreichen Effekt auf die mobile Internetgeschwindigkeit.

14.I Happiness Score - Mobile Speed¶

In diesem Scatterplot wird der Happiness Score mit der mobilen Internetgeschwindigkeit in Mbps verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [25]:
plotBroadBand = sns.lmplot(x="HappinessScore2022", y="MobileSpeed", data=dataset)
plotBroadBand.set_xlabels('Happiness Score')
plotBroadBand.set_ylabels('Mobile Speed in Mbps')
plotBroadBand.savefig(r'..\output\Happiness Score - Mobile Speed.png')
plt.show()

Die Grafik zeigt eine starke Korrelation zwischen den Daten. So steigt die mobile Internetgeschwindigkeit, wenn der Happiness Score höher ist. Vermutlich ist der Effekt andersrum eher ausschlaggebend, so wird vermutlich der Happiness Score durch eine höhere mobile Internetgeschwindigkeit positiv beeinflusst.

14.J Happiness Score - Broadband Speed¶

In diesem Scatterplot wird der Happiness Score mit der Breitbandgeschwindigkeit in Mbps verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [26]:
plotBroadBand = sns.lmplot(x="HappinessScore2022", y="BroadbandSpeed", data=dataset)
plotBroadBand.set_xlabels('Happiness Score')
plotBroadBand.set_ylabels('Broadband Speed in Mbps')
plotBroadBand.savefig(r'..\output\Happiness Score - Broadband Speed.png')
plt.show()

Die Grafik zeigt eine starke Korrelation zwischen den Daten. So steigt die Breitbandgeschwindigkeit, wenn der Happiness Score höher ist. Wie bereits in den zuvor beschriebenen Graphen sind hier die Unterschiede in der Breitbandgeschwindigkeit bei gleichem Happiness Score auffällig. Auch ist hier ebenfalls der Effekt vermutlich eher umgekehrt und eine höhere Breitbandgeschwindigkeit hat einen positiven Einfluss auf den Happiness Score.

14.K Unemployment - Internet Access¶

In diesem Scatterplot wird der die Arbeitslosenquote in % mit dem Internet Access in % verglichen. Hierbei wird geprüft, ob eine Korrelation zwischen den Daten besteht.

In [27]:
plotBroadBand = sns.lmplot(x="Unemployment2021", y="InternetAccess2020", data=dataset)
plotBroadBand.set_xlabels('Unemployment in %')
plotBroadBand.set_ylabels('Internet Access in %')
plotBroadBand.savefig(r'..\output\Unemployment - Internet Access.png')
plt.show()

Die Grafik zeigt eine leicht negative Korrelation zwischen den Daten. Sinkt die Arbeitslosenquote, so steigt der Internet Access. Auffällig sind hier die großen Unterschiede im Internet Access trotz gleicher Arbeitslosenquote. So sind die Unterschiede bei 0-5 % Arbeitslosenquote in einem Rahmen zwischen ~5 und fast 100 % Internet Access. Da hier allerdings eine sehr leichte Korrelationen vorhanden ist, haben die beiden Faktoren einen sehr kleinen Einfluss aufeinander.

15. NaN Percentage¶

Die unten zu sehende Grafik zeigt an, wie viele NaN Werte die einzelnen Datensätze haben. Bei NaN Werten handelt es sich um nicht vorhandene Werte.

In [28]:
percent = dataset.isna().mean().round(4) * 100
f, ax = plt.subplots()
percent.drop('YearGDP', axis=0, inplace=True)

for i,item in enumerate(zip(percent.keys(),percent.values)):
    if (item[1] > 0):
        ax.bar(item[0], item[1], label = item[0])
        #ax.text(i - 0.25, item[1] + 1.5 , str(np.round(item[1],2)))

ax.set_xticklabels([])
ax.set_xticks([])
plt.ylim(0,50)
plt.ylabel('Percentage of NaN Values')
plt.legend()
plt.savefig(r'..\output\NaN Values.png')
plt.show()

In einem Balkendiagramm dargestellt sind die Prozentual vorhandenen NaN Werte pro Datensatz. So haben wir beim mobile Speed mit knapp 23 % am meisten NaN Werte, bei GDP mit ca. 2 % am wenigsten. Internet Access, Military Spending und der Happiness Score haben alle knapp über oder unter 20 % NaN Werte. Unemployment hat 7 % fehlende Werte. Broadband Speed ist in diesem Diagramm nicht vorhanden, da alle Daten vorhanden sind.

16. Pairplots¶

Bei Pairplots handelt es sich um eine Matrix aus Scatterplots. Es soll die Korrelationen zwischen den einzelnen Datensätzen nochmal direkt und gesammelt in einer Grafik veranschaulichen.

16.A Pairplot - Mobile Speed¶

Im Folgenden werden nochmal alle Korrelationen der Datensätze mit der mobilen Internetgeschwindigkeit und auch untereinander in einer Matrix dargestellt.

In [29]:
tmpMobile = dataset.drop('CountryCode', axis=1)
tmpMobile.drop('CountryName', axis=1, inplace=True)
tmpMobile.drop('YearGDP', axis=1, inplace=True)
tmpMobile.drop('YearInternetSpeed', axis=1, inplace=True)
tmpMobile.drop('BroadbandSpeed', axis=1, inplace=True)

tmpMobile = tmpMobile.dropna()

plot = sns.pairplot(tmpMobile[['MobileSpeed', 'GDP', 'InternetAccess2020', 'Unemployment2021', 'MilitarySpending2018', 'HappinessScore2022']], diag_kind='kde')
plot.savefig(r'..\output\Mobile Speed - Pair plot.png')
plt.show()

Da es sich hier nur um eine Gesamtansicht aller Scatterplots handelt, gibt es hier auch keine Abweichungen zu den bereits beschriebenen Scatterplots. Was in dieser Matrix ebenfalls zu sehen ist, sind die Korrelationen der Datensätze untereinander, nicht nur mit den Internetgeschwindigkeiten. Dies hat allerdings keinen Einfluss auf das Endergebnis.

16.B Pairplot - Broadband Speed¶

Im Folgenden werden nochmal alle Korrelationen der Datensätze mit der Breitbandgeschwindigkeit und auch untereinander in einer Matrix dargestellt.

In [30]:
tmpBroadband = dataset.drop('CountryCode', axis=1)
tmpBroadband.drop('CountryName', axis=1, inplace=True)
tmpBroadband.drop('YearGDP', axis=1, inplace=True)
tmpBroadband.drop('YearInternetSpeed', axis=1, inplace=True)
tmpBroadband.drop('MobileSpeed', axis=1, inplace=True)

tmpBroadband = tmpBroadband.dropna()

plot = sns.pairplot(tmpBroadband[['BroadbandSpeed', 'GDP', 'InternetAccess2020', 'Unemployment2021', 'MilitarySpending2018', 'HappinessScore2022']], diag_kind='kde')
plot.savefig(r'..\output\Broadband Speed - Pair plot')
plt.show()

Da es sich hier nur um eine Gesamtansicht aller Scatterplots handelt, gibt es hier auch keine Abweichungen zu den bereits beschriebenen Scatterplots. Was in dieser Matrix ebenfalls zu sehen ist, sind die Korrelationen der Datensätze untereinander, nicht nur mit den Internetgeschwindigkeiten. Dies hat allerdings keinen Einfluss auf das Endergebnis.

17. Heatmaps¶

Heatmaps visualisieren Daten mit einem Diagramm. Diese Daten werden durch eine Funktion gegeben die eine zweidimensionale Definitionsmenge farblich darstellen. Das soll dazu dienen, die Korrelationskoeffizienten der verschiedenen Daten untereinander schnell und einfach ersichtlich zu machen.

17.A Heatmap Correlation Mobile¶

Hier werden die Korrelationskoeffizienten zwischen dem Mobile Speed und den einzelnen Daten dargestellt. Auch die Daten selbst werden untereinander verglichen.

In [31]:
sns.heatmap(tmpMobile.corr(method='pearson', min_periods=1), annot=True)
plt.title('Correlation Matrix Mobile', fontsize=16);
fig = plt.gcf()
fig.set_size_inches(18.5, 10.5)
plt.savefig(r'..\output\Correlation Mobile.png')
plt.show()

Gut zu sehen ist, dass InternetAccess und HappinessScore2022 die größte Korrelation mit der mobilen Internetgeschwindigkeit haben. Entgegen der Erwartungen bei den Scatterplots, dargestellt durch ziemlich unterschiedliche Medianlinien, haben GDP und MilitarySpending2018 fast den gleichen Korrelationskoeffizienten mit der mobilen Internetgeschwindigkeit. Beide korrelieren leicht mit der mobilen Internetgeschwindigkeit. Auch entgegen der Aussage des Scatterplots, hat die Arbeitslosenquote keine Korrelation mit der mobilen Internetgeschwindigkeit. Eine Auffälligkeit, die noch interessant zu betrachten ist, ist die Korrelation von fast 1 zwischen GDP und MilitarySpending2018. InternetAccess2020 und Unemployment2021 haben, wie beim Scatterplot abzulesen war, keine Korrelation miteinander.

17.B Heatmap Correlation Broadband¶

Hier werden die Korrelationskoeffizienten zwischen dem Broadband Speed und den einzelnen Daten dargestellt. Auch die Daten selbst werden untereinander verglichen.

In [32]:
sns.heatmap(tmpBroadband.corr(method='pearson', min_periods=1), annot=True)
plt.title('Correlation Matrix Broadband', fontsize=16);
fig = plt.gcf()
fig.set_size_inches(18.5, 10.5)
plt.savefig(r'..\output\Correlation Broadband.png')
plt.show()

Die Korrelationen mit der Breitbandgeschwindigkeit sind auffälligerweise stärker als mit der mobilen Internetgeschwindigkeit. So weisen HappinessScore2022 und InternetAccess2020 eine ähnliche Korrelation zur Breitbandgeschwindigkeit wie zur mobilen Internetgeschwindigkeit auf, dennoch eine höhere bei der Breitbandgeschwindigkeit. Auch bei MilitarySpending2018 und GDP sind die Korrelationen deutlich stärker. Ebenso ist die negative Korrelation mit Unemployment2021 gegeben. Das bedeutet, dass die Arbeitslosenquote mathematisch gesehen einen leichten Einfluss auf die Breitbandgeschwindigkeit hat, aber keinen auf die mobile Internetgeschwindigkeit. Vor allem heutzutage ist das eine Auffälligkeit, da Menschen viel mobiler unterwegs sind und daher eher eine stärker Korrelation zwischen den Daten und der mobilen Internetgeschwindigkeit erwartet wurde.

18. Adjusting tmpMobile¶

Hier werden die Daten so vorbereitet, dass später gezeigt werden kann, wann ein Land eine über- oder unterdurchschnittliche mobile Internetgeschwindigkeit hat.

In [33]:
average = tmpMobile['MobileSpeed'].mean()
tmpMobile.insert(0, 'OverAverage', np.where(tmpMobile['MobileSpeed'] > average, 1, 0))
tmpMobile.drop('MobileSpeed', axis=1, inplace=True)

Zunächst wird der Mittelwert aller MobileSpeed-Daten errechnet und in einer Variable gespeichert. Nun wird der Wert jedes einzelnen Landes mit dem Mittelwert verglichen. Liegt ein Land unter dem Durchschnitt, bekommt es den Wert 0, liegt es darüber bekommt es den Wert 1. Die tatsächliche Geschwindigkeit wird zum Schluss aus den Daten entfernt.

19. Adjusting tmpBroadband¶

Hier werden die Daten so vorbereitet, dass später gezeigt werden kann, wann ein Land eine über- oder unterdurchschnittliche Breitbandgeschwindigkeit hat.

In [34]:
average = tmpBroadband['BroadbandSpeed'].mean()
tmpBroadband.insert(0, 'OverAverage', np.where(tmpBroadband['BroadbandSpeed'] > average, 1, 0))
tmpBroadband.drop('BroadbandSpeed', axis=1, inplace=True)

Zunächst wird der Mittelwert aller BroadbandSpeed-Daten errechnet und in einer Variable gespeichert. Nun wird der Wert jedes einzelnen Landes mit dem Mittelwert verglichen. Liegt ein Land unter dem Durchschnitt, bekommt es den Wert 0, liegt es darüber bekommt es den Wert 1. Die tatsächliche Geschwindigkeit wird zum Schluss aus den Daten entfernt.

20. Mobile Speed Neural Net¶

In diesem Teil der Arbeit wird das neuronale Netz für die mobile Internetgeschwindigkeit trainiert und ausgeführt.

20.A Mobile Speed - Deep Learning¶

Im folgenden Codeblock wird ein Neurales Netzwerk erstellt, dass dazu dient anhand der Parameter GDP, InternetAccess, Unemployment, MilitarySpending und HappinesScore zu erkennen, ob ein Land eine Über- oder Unterdurchschnittliche Mobile Internetgeschwindigkeit hat. Hierbei wird ein neuronales Netz mit 2 Hidden Layern gewählt, diese wird unter Mobile Speed - Neural Network Visualization dargestellt. Die Lernrate wird auf 0.001 heruntergestellt. Trainiert wird das neuronale Netz mit 50 Epochen und einer Batch Size von 128. Hierbei wird der Datensatz in eine zufällige Reihenfolge gebracht. Zum training werden 2/3 der Daten verwendet, mit dem restlichen 1/3 wird das Training validiert.

In [35]:
labels=tmpMobile['OverAverage']
features = tmpMobile.iloc[:,1:6]
X=features
y=np.ravel(labels)

opt = keras.optimizers.Adam(learning_rate=0.001)
model_mobile = Sequential()
model_mobile.add(Dense(5, activation='relu', input_shape=(5,)))
model_mobile.add(Dense(3, activation='relu'))
model_mobile.add(Dense(1, activation='sigmoid'))
model_mobile.compile(loss='binary_crossentropy',
optimizer=opt,
metrics=['accuracy'])
training_mobile = model_mobile.fit(X, y,epochs=50, batch_size=128, verbose=0, shuffle=True, validation_split=0.33)


plt.plot(training_mobile.history['accuracy'])
plt.plot(training_mobile.history['val_accuracy'])
plt.title('Mobile Speed Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['training', 'validation'], loc='upper left')
plt.savefig(r'..\output\Mobile Speed - Accuracy.png')
plt.show()



plt.plot(training_mobile.history['loss'])
plt.plot(training_mobile.history['val_loss'])
plt.title('Mobile Speed Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['train', 'val'], loc='upper left')
plt.savefig(r'..\output\Mobile Speed - Loss.png')
plt.show()

In den überliegenden Grafiken wird das Training des neuronalen Netzwerks visualisiert. Hierbei lässt sich erkennen, dass die Fehlerquote (Loss) stetig sinkt. Die Genauigkeit steigt und sinkt, erhöht sich tendenziell jedoch. Um die Genauigkeit weiter zu erhöhen, müssten weitere Daten zum Trainieren verwendet werden. Da es hier jedoch keine weiteren Daten gibt, wäre das künstliche Erweitern des Datensatzes eine option. Dies wurde jedoch aus Zeitgründen nicht gemacht.

20.B Mobile Speed - Over Average¶

In diesem Teil wird errechnet, ab welchem Wert ein Land eine überdurchschnittliche mobile Internetgeschwindigkeit hat und wie die anderen Daten dabei im Vergleich stehen. Danach werden die Ergbnisse der Rechnung durch Diagramme grafisch dargestellt.

In [36]:
df = pd.DataFrame(tmpMobile, columns= np.array(tmpMobile.columns))
overAverage = df.loc[(df.OverAverage == 1)]
fig, ax = plt.subplots(2,3,figsize=(16, 4) )
i = 0
j = 0
for c in overAverage.columns[0:]:
    ax[j,i].hist(overAverage[c])
    ax[j,i].set_title(c)
    i = i + 1
    if i == 3:
        j = 1
        i = 0
ax[0,0].set_title("Over Average")
fig.subplots_adjust(hspace=1, wspace=0.2)


plt.savefig(r'..\output\Mobile Speed - Over Average.png')
plt.show()

Wichtig zu beachten hier sind die verschiedenen Skalierungen der Diagramme. Das erste Diagramm sagt aus wie viele Länder überdurchschnittliche mobile Internetgeschwindigkeiten haben. Dabei handelt es sich um ca. 40. Das Diagramm GDP ist leider nicht sehr aussagekräftig, was aber zu herauszulesen ist, ist dass die Länder mit überdurchschnittlicher mobilen Internetgeschwindigkeit einen GDP zwischen 0 und ca. 17500 haben. Beim InternetAccess2020 bewegen sich die überdurchschnittlichen Länder zwischen 70 und 100 % Internetaccess. Die meisten davon zwischen 90 und 100 %. Zwischen 2 und 8 % Arbeitslosenquote befinden sich die meisten Länder mit überdurchschnittlicher mobilen Internetgeschwindigkeit. Auffällig hier sind nochmal Länder bei ca 11 und 15 %. Wie beim GDP ist auch bei MilitarySpending 2018 nicht viel lesbar. Nur die Spanne zwischen 0 und 600000 in welchem Bereich die Länder liegen. Beim HappinessScore2022 liegt die Spanne der Länder zwischen ca. 5,3 und 7,8. Die meisten davon bei einem Score von 6,0 - 6,25. Auffälligerweise sinkt die Anzahl an Ländern mit überdurchschnittlicher mobilen Internetgeschwindigkeit bei höherem Happiness Score.

20.C Mobile Speeds - Under Average¶

In diesem Teil wird errechnet, ab welchem Wert ein Land eine unterdurchschnittliche mobile Internetgeschwindigkeit hat. Danach werden die Ergbnisse der Rechnung durch Diagramme grafisch dargestellt.

In [37]:
df = pd.DataFrame(tmpMobile, columns= np.array(tmpMobile.columns))
overAverage = df.loc[(df.OverAverage == 0)]
fig, ax = plt.subplots(2,3,figsize=(16, 4) )
i = 0
j = 0
for c in overAverage.columns[0:]:
    ax[j,i].hist(overAverage[c])
    ax[j,i].set_title(c)
    i = i + 1
    if i == 3:
        j = 1
        i = 0
ax[0,0].set_title("Over Average")
fig.subplots_adjust(hspace=1, wspace=0.2)


plt.savefig(r'..\output\Mobile Speed - Under Average.png')
plt.show()

Wichtig zu beachten hier sind die verschiedenen Skalierungen der Diagramme. Das erste Diagramm sagt aus wie viele Länder unterdurchschnittliche mobile Internetgeschwindigkeiten haben. Dabei handelt es sich um ca 70 Länder. Das zweite Diagramm zeigt, dass vor allem Länder mit einem GDP zwischen 0 und 500 eine unterdurchschnittliche mobile Internetgeschwindigkeit haben. Insgesamt befinden sich die Länder bei einem GDP zwischen 0 und ca. 2250. Beim InternetAccess2020 befinden sich die Länder in einer Spanne zwischen ca. 18 und 93 %. Dabei erreicht kein Land die 100 %. Eine größere Ansammlung von Ländern lässt sich ab ca. 60 % finden, davor ist eine gleiche Verteilung zu erkennen. Bei Unemployment2021 gibt es erstaunlicherweise ab 1 % Arbeitslosigkeit bereits die zweitgrößte Ansammlung an Ländern. Bei 5 % finden sich die meisten Länder, danach ist die Tendenz fallend, allerdings bis zu einer Arbeitslosenquote von ca. 3 %. MilitarySpending2018 ist wenig aussagekräftig. Zwischen 0 und ca. 7500 befinden sich die meisten Länder, danach sind nur vereinzelt Länder zu finden. Die Spanne liegt zwischen 0 und 70000. Der HappinessScore2022 beinhaltet Länder von einem Wert von ca. 2,2 bis 7,5. Am meisten Länder mit unterdurchschnittlicher mobilen Internetgeschwindigkeit lassen sich zwischen 4,5 und 6,5 finden.

20.D Vergleich Mobile Speed Over Average / Under Average¶

Vergleicht man nun die Länder mit über- und unterdurchschnittlicher mobilen Internetgeschwindigkeit miteinander, fällt auf, dass es mehr unter- als überdurchschnittliche Länder gibt. Auch sind die Unterschiede an Ansammlungen und Spannweiten auffällig. So ist die Spannweite des GDP bei Ländern über dem Durchschnitt um einiges höher als bei denen die unter dem Durchschnitt liegen. Das lässt darauf schließen, dass ein höherer GDP auf eine überdurchschnittliche mobile Internetgeschwindigkeit schließen lassen kann, aber nicht muss. Auch bei den Ländern über dem Durchschnitt finden sich die meisten zwischen 0 und 4000, wobei vermutlich viele überdurchschnittliche Länder ähnliche Werte haben wie die Unterdurchschnittlichen. Auch haben Länder mit überdurchschnittlicher mobilen Internetgeschwindigkeit einen Internet Access der nicht kleiner als 70 % ist und bei fast 100 % liegen kann. Länder unter dem Durchschnitt liegen in einem Bereich zwischen 18 und 93 %. Hier kann man also die Aussage treffen, dass Länder mit einem Internet Access höher als 93 % eine überdurchschnittliche mobile Internetgeschwindigkeit haben. Bei der Arbeitslosenquote lassen sich die überdurchschnittlichen Länder in einem viel kleineren Bereich eingrenzen als die unterdurchschnittlichen. So sind die Länder über dem Durchschnitt in einem Bereich zwischen knapp unter 2 % und knapp über 16 %, während die Unterdurchschnittlichen von ca. 1 % bis 33 % verteilt sind. Hier lässt sich also die Aussage treffen, dass Länder mit einer Arbeitslosenquote unter 2 % und über 16 % eine mobile Internetgeschwindigkeit unter dem Durchschnitt haben. Aus dem military Spending lässt herausnehmen, dass Länder die mehr als 60000 Mio USD ausgeben, eine überdurchschnittliche mobile Internetgeschwindigkeit haben. Ansonsten finden sich hier zu viele Länder auf ähnlichem Niveau, was eine Abgrenzung praktisch nicht möglich macht. Zuletzt lässt sich auch beim Happiness Score herauslesen, ob ein Land im Bereich liegt über- oder unterdurchschnittlich zu sein. So befinden sich die länder mit überdurchschnittlicher mobilen Internetgeschwindigkeit bei einem Happiness Score zwischen 5,2 und 7,8. Die unter dem Durchschnitt zwischen 2,2 und 7,5. Daher lässt sich Sagen, dass Länder unter 5,2 unter dem Durchschnitt und Länder über 7,5 über dem Durchschnitt sind.

20.E Mobile Speed - Neural Network Visualization (Folgenden Codeblock beschreiben und zur gliederung hinzufügen)¶

Hier wird die Funktion vom Anfang aufgerufen, um das erstellte neuronale Netzwerk Grafisch darzustellen, für genauere Informationen wie dies geschieht klicken Sie hier.

In [38]:
visualize_nn(model_mobile, 'Mobile Speed - Neural Network', description=True, figsize=(10,8))

(Grafik darüber beschreiben und als Unterpunkt der Gliederung hinzufügen)¶

21. Broadband Speed Neural Net¶

21.A Broadband Speed - Deep Learning¶

Im folgenden Codeblock wird ein Neurales Netzwerk erstellt, dass dazu dient anhand der Parameter GDP, InternetAccess, Unemployment, MilitarySpending und HappinesScore zu erkennen, ob ein Land eine Über- oder Unterdurchschnittliche Festnetz Internetgeschwindigkeit hat. Hierbei wird ein neuronales Netz mit 2 Hidden Layern gewählt, diese wird unter Broadband Speed - Neural Network Visualization dargestellt. Die Lernrate wird auf 0.001 heruntergestellt. Trainiert wird das neuronale Netz mit 50 Epochen und einer Batch Size von 128. Hierbei wird der Datensatz in eine zufällige Reihenfolge gebracht. Zum training werden 2/3 der Daten verwendet, mit dem restlichen 1/3 wird das Training validiert.

In [39]:
labels=tmpBroadband['OverAverage']
features = tmpBroadband.iloc[:,1:6]
X=features
y=np.ravel(labels)

opt = keras.optimizers.Adam(learning_rate=0.001)
model_broadband = Sequential()
model_broadband.add(Dense(5, activation='relu', input_shape=(5,)))
model_broadband.add(Dense(3, activation='relu'))
model_broadband.add(Dense(1, activation='sigmoid'))
model_broadband.compile(loss='binary_crossentropy',
optimizer=opt,
metrics=['accuracy'])
training_broadband = model_broadband.fit(X, y,epochs=50, batch_size=128, verbose=0, shuffle=True, validation_split=0.33)


plt.plot(training_broadband.history['accuracy'])
plt.plot(training_broadband.history['val_accuracy'])
plt.title('Broadband Speed Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['training', 'validation'], loc='upper left')
plt.savefig(r'..\output\Broadband Speed - Accuracy.png')
plt.show()



plt.plot(training_broadband.history['loss'])
plt.plot(training_broadband.history['val_loss'])
plt.title('Broadband Speed Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['train', 'val'], loc='upper left')
plt.savefig(r'..\output\Broadband Speed - Loss.png')
plt.show()

In den überliegenden Grafiken wird das Training des neuronalen Netzwerks visualisiert. Hierbei lässt sich erkennen, dass die Fehlerquote (Loss) stetig sinkt. Die Genauigkeit steigt und sinkt, erhöht sich tendenziell jedoch. Um die Genauigkeit weiter zu erhöhen, müssten weitere Daten zum Trainieren verwendet werden. Da es hier jedoch keine weiteren Daten gibt wäre das künstliche Erweitern des Datensatzes eine option. Dies wurde jedoch aus Zeitgründen nicht gemacht.

21.B Broadband Speed - Over Average (Folgenden Codeblock beschreiben und zur gliederung hinzufügen)¶

In [40]:
df = pd.DataFrame(tmpBroadband, columns= np.array(tmpBroadband.columns))
overAverage = df.loc[(df.OverAverage == 1)]
fig, ax = plt.subplots(2,3,figsize=(16, 4) )
i = 0
j = 0
for c in overAverage.columns[0:]:
    ax[j,i].hist(overAverage[c])
    ax[j,i].set_title(c)
    i = i + 1
    if i == 3:
        j = 1
        i = 0
ax[0,0].set_title("Over Average")
fig.subplots_adjust(hspace=1, wspace=0.2)


plt.savefig(r'..\output\Broadband Speed - Over Average.png')
plt.show()

12.C Broadband Speed - Under Average (Folgenden Codeblock beschreiben und zur gliederung hinzufügen)¶

In [41]:
df = pd.DataFrame(tmpBroadband, columns= np.array(tmpBroadband.columns))
overAverage = df.loc[(df.OverAverage == 0)]
fig, ax = plt.subplots(2,3,figsize=(16, 4) )
i = 0
j = 0
for c in overAverage.columns[0:]:
    ax[j,i].hist(overAverage[c])
    ax[j,i].set_title(c)
    i = i + 1
    if i == 3:
        j = 1
        i = 0
ax[0,0].set_title("Over Average")
fig.subplots_adjust(hspace=1, wspace=0.2)


plt.savefig(r'..\output\Broadband Speed - Under Average.png')
plt.show()

(Grafik darüber beschreiben und als Unterpunkt der Gliederung hinzufügen)¶

21.D Vergleich Broadband Speed Over Average / Under Average¶

21.E Broadband Speed - Neural Network Visualisation¶

Hier wird die Funktion vom Anfang aufgerufen, um das erstellte neuronale Netzwerk Grafisch darzustellen, für genauere Informationen wie dies geschieht klicken Sie hier.

In [42]:
visualize_nn(model_broadband, 'Broadband Speed - Neural Network', description=True, figsize=(10,8))

(Grafik darüber beschreiben und als Unterpunkt der Gliederung hinzufügen)¶

22. Welt Ansichten¶

In diesem letzten Abschnitt werden die Internetgeschwindigkeiten auf einer Weltkugel grafisch dargestellt. Wenn man mit dem Mauszeiger über ein Land "hovert" wird das Land und dessen Internetgeschwindigkeit angezeigt. Lässt man auf der Maus die linke Maustaste gedrückt, kann man die Weltkugel drehen. Mit dem Mausrad lässt sich die Kugel vergrößern und verkleinern.

22.A Welt - Broadband Speed¶

Hier wird die Weltkugel mit den Breitbandgeschwindigkeiten dargestellt. Die Kugel kann nicht in output Ordner gespeichert werden.

In [43]:
internet_speed_country = dataset
internet_speed_country.reset_index()

world_broadband = px.choropleth(
    internet_speed_country,                 #Das Datenset das verwendet wird
    locations='CountryCode',                #Länder werden über die Spalte CountryCode zugeordnet
    locationmode='ISO-3',                   #Länder werden mit 3 Digit CountryCodes zugeordnet
    color='BroadbandSpeed',                 #Die Farben werden nach dem BroadbandSpeed vergeben
    color_continuous_scale= 'temps_r',      #Die Farbscala temps wird reversed verwendet
    hover_name='CountryName',               #Beim Hovern soll der Name des Landes angezeigt werden
    title = 'Broadband Speed - Worldwide')  #Die Überschrift der Karte

world_broadband.update_geos(projection_type="orthographic",
                        showocean=True,
                        showlakes=True,
                        showcountries=True,
                        lataxis_showgrid=True,
                        lonaxis_showgrid=True) #Weitere Einstellungen für die Karte

world_broadband.update_layout(height=800, margin={"r":0,"t":80,"l":0,"b":50}) #Anpassen des Layouts

world_broadband.show()  #Anzeige der Welt

Die Weltkugel zeigt nochmal visuell, wie die Breitbandgeschwindigkeit auf der Erde ist. Rechts an der Legende ist ersichtlich, welche Farbe welche Geschwindigkeit darstellt. So ist Rot am langsamsten, Grün am schnellsten. Bei den schwarz markierten Ländern wurden keine relevanten Daten gefunden.

22.B Welt - Mobile Speed¶

Hier wird die Weltkugel mit den mobilen Internetgeschwindigkeiten dargestellt. Die Kugel kann nicht in output Ordner gespeichert werden.

In [44]:
internet_speed_country = dataset
internet_speed_country.reset_index()

world_mobile = px.choropleth(
    internet_speed_country,                 #Das Datenset das verwendet wird
    locations='CountryCode',                #Länder werden über die Spalte CountryCode zugeordnet
    locationmode='ISO-3',                   #Länder werden mit 3 Digit CountryCodes zugeordnet
    color='MobileSpeed',                 #Die Farben werden nach dem BroadbandSpeed vergeben
    color_continuous_scale= 'temps_r',      #Die Farbscala temps wird reversed verwendet
    hover_name='CountryName',               #Beim Hovern soll der Name des Landes angezeigt werden
    title = 'Mobile Speed - Worldwide')  #Die Überschrift der Karte

world_mobile.update_geos(projection_type="orthographic",
                        showocean=True,
                        showlakes=True,
                        showcountries=True,
                        lataxis_showgrid=True,
                        lonaxis_showgrid=True) #Weitere Einstellungen für die Karte

world_mobile.update_layout(height=800, margin={"r":0,"t":80,"l":0,"b":50}) #Anpassen des Layouts

world_mobile.show()  #Anzeige der Welt

Die Weltkugel zeigt nochmal visuell, wie die mobile Internetgeschwindigkeit auf der Erde ist. Rechts an der Legende ist ersichtlich, welche Farbe welche Geschwindigkeit darstellt. So ist Rot am langsamsten, Grün am schnellsten. Bei den schwarz markierten Ländern wurden keine relevanten Daten gefunden.

23. Quellen:¶

Internet Speeds:¶

https://www.kaggle.com/datasets/prasertk/internet-broadband-and-mobile-speeds-by-country

Unemployment:¶

https://data.worldbank.org/indicator/SL.UEM.TOTL.ZS?end=2021&name_desc=false&start=1991&view=chart

Military Spending:¶

https://www.kaggle.com/datasets/nitinsss/military-expenditure-of-countries-19602019

Internet Access:¶

https://data.worldbank.org/indicator/IT.NET.USER.ZS

GDP:¶

https://www.kaggle.com/datasets/tunguz/country-regional-and-world-gdp

World Happiness Report:¶

https://www.kaggle.com/datasets/mathurinache/world-happiness-report

In [45]:
os.system("jupyter nbconvert --to html InternetSpeed.ipynb")
Out[45]:
0